package org.dromara.common.feign.interceptor;

import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.same.SaSameUtil;
import cn.dev33.satoken.stp.StpUtil;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.context.request.RequestContextHolder;

/**
 * feign拦截器, 在feign请求发出之前，加入一些操作
 *
 * @author shuai.zhou
 */
@Slf4j
public class FeignInterceptor implements RequestInterceptor {

    /**
     * 服务间内部调用鉴权
     */
    @Override
    public void apply(RequestTemplate requestTemplate) {
        if (SaManager.getConfig().getCheckSameToken()) {
            // 为 Feign 的 RCP调用 添加请求头Same-Token
            requestTemplate.header(SaSameUtil.SAME_TOKEN, SaSameUtil.getToken());
        }

        // 如果希望被调用方有会话状态，此处就还需要将 satoken 添加到请求头中
        if (isWeb() && isLogin()) {
            requestTemplate.header(StpUtil.getTokenName(), "Bearer " + StpUtil.getTokenValue());
        }
    }

    /**
     * 非web上下文无法获取HttpServletRequest
     * https://sa-token.cc/doc.html#/more/common-questions
     */
    private boolean isWeb() {
        return RequestContextHolder.getRequestAttributes() != null;
    }

    /**
     * 是否登录
     */
    private boolean isLogin() {
        try {
            StpUtil.isLogin();
            return true;
        } catch (Exception e) {
            return false;
        }
    }

}
